package jnpf.database.source.impl;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.handler.TableNameHandler;
import jnpf.database.data.DataSourceContextHolder;
import jnpf.database.entity.DbLinkEntity;
import jnpf.database.enums.DbAliasEnum;
import jnpf.database.enums.datatype.DataTypeEnum;
import jnpf.database.enums.datatype.DtSqlserverEnum;
import jnpf.database.model.DataTypeModel;
import jnpf.database.model.DbTableFieldModel;
import jnpf.database.model.DbTableModel;
import jnpf.database.source.DbBase;
import jnpf.database.sql.SqlBase;
import jnpf.database.sql.impl.SqlSQLServer;
import jnpf.database.util.CommonUtil;
import jnpf.database.util.ConnUtil;
import jnpf.database.util.DataSourceUtil;
import jnpf.exception.DataException;
import jnpf.util.StringUtil;
import lombok.extern.slf4j.Slf4j;

import java.io.File;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;

/**
 * SQLServer模型
 *
 * @author JNPF开发平台组 YY
 * @version V3.2.0
 * @copyright 引迈信息技术有限公司
 * @date 2021/10/06
 */
@Slf4j
public class DbSQLServer extends DbBase {

    public static final String DB_ENCODE = "SQLServer";
    public static final String CONN_URL = "jdbc:sqlserver://{host}:{port};databaseName={dbname}";

    @Override
    public void setDbType() {
        mpDbType = DbType.SQL_SERVER;
        connUrlEncode = "sqlserver";
        dbEncode = DB_ENCODE;
        driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
    }

    @Override
    public SqlBase getSqlBase() {
        return new SqlSQLServer(this);
    }

    @Override
    public DataTypeModel getDataTypeModel(DataTypeEnum dte){
        return dte.getDtSqlserverEnum().getDataTypeModel();
    }

    @Override
    public DataTypeModel getDataTypeModel(String dbFieldType) {
        for(DtSqlserverEnum dataType : DtSqlserverEnum.values()){
            if(dbFieldType.equals(dataType.getDbFieldType())){
                return dataType.getDataTypeModel();
            }
        }
        return null;
    }

    @Override
    public String getConnUrl(String prepareUrl, String host, Integer port, String dbName) {
        if (StringUtil.isEmpty(prepareUrl)) {
            prepareUrl = CONN_URL;
        }
        return super.getConnUrl(prepareUrl, host, port, dbName);
    }

    @Override
    public void setDynamicMap(HashMap<String, TableNameHandler> map, DbTableModel dbTableModel) {
        map.put(dbTableModel.getTable(), (sql, tableName) -> DataSourceContextHolder.getDatasourceName()+".dbo."+dbTableModel.getTable());
    }

    @Override
    public DbTableFieldModel getFieldModel(ResultSet result) throws SQLException, DataException {
        DbTableFieldModel model = new DbTableFieldModel();
        /*  Text 和 Image 是可能被 SQServer 以后的版本淘汰的数据类型
            varchar(max)-------text;
            nvarchar(max)-----ntext;
            varbinary(max)----p_w_picpath.
            查询出来只能显示nvarchar，长度-1的时候代表nvarchar(max)，项目中转换成text */
        // 字段类型
        String dataType = result.getString(DbAliasEnum.DATA_TYPE.asByDb(this));
        // 字段长度
        int dataLength = result.getInt(DbAliasEnum.DATA_LENGTH.asByDb(this));
        // nvarchar会显示-1
        if("nvarchar".equals(dataType) && dataLength == -1){
            model.setDataType(DataTypeEnum.TEXT.getViewFieldType());
            model.setDefaults("默认");
        }


        return model;
    }

    @Override
    public String getDbTime(Connection conn) {
        StringBuilder sql = new StringBuilder();
        sql.append("Select CONVERT(varchar(100), GETDATE(), 120) as TIME");
        return dbTimeCommon(conn,sql);
    }

    @Override
    public String getReplaceSql(String sql, String table, DataSourceUtil dbSourceOrDbLink) {
        //目前只涉及表名参数
        return CommonUtil.getReplaceSql(sql,table,dbSourceOrDbLink,
                false,
                false,
                false);
    }



}
